001    /* EVolve - an Extensible Software Visualization Framework
002     * Copyright (C) 2001-2002 Qin Wang
003     *
004     * This library is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU Library General Public
006     * License as published by the Free Software Foundation; either
007     * version 2 of the License, or (at your option) any later version.
008     *
009     * This library is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
012     * Library General Public License for more details.
013     *
014     * You should have received a copy of the GNU Library General Public
015     * License along with this library; if not, write to the
016     * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017     * Boston, MA 02111-1307, USA.
018     */
019    
020    /*
021     * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022     */
023    
024    package EVolve;
025    
026    import EVolve.visualization.*;
027    import EVolve.util.predefinedutils.VisualizationSerializer;
028    import EVolve.util.settings.*;
029    import EVolve.util.overlappers.OverlapVisualization;
030    import EVolve.util.phasedetectors.phasedetectorUI.PhaseDetectorToolBar;
031    import EVolve.data.DataManager;
032    import java.awt.*;
033    import java.awt.Dimension;
034    import java.awt.event.*;
035    import java.util.*;
036    import java.io.*;
037    import javax.swing.*;
038    import javax.swing.event.*;
039    
040    public class UIManager {
041        private JFrame frame;
042        private JDesktopPane desktop;
043        private boolean doNotRemoveWindow;
044    
045        private ArrayList windowList;
046    
047        private JPanel panelStatus;
048        private JLabel labelStatus;
049    
050        private JMenuBar menuBar;
051    
052        private JMenu menuFile;
053        private JMenuItem itemLoad;
054        private JMenuItem itemAddDataSource;
055        private JMenuItem itemExit;
056    
057        private JMenu menuVisualization;
058        private JMenu menuNew;
059        private JMenuItem[] itemNew;
060        private JMenuItem itemVisualize;
061        private JMenuItem itemPredefinedVisualize;
062    
063        private JMenu menuWindow;
064        private JMenuItem itemArrange;
065    
066        /** added functions */
067        private JMenu menuTool;
068    
069        private JMenu menuBatch;
070        private JMenuItem itemBuildBatch;
071        private JMenuItem itemRunBatch;
072    
073        private JMenu menuPredefinedViz;
074        private JMenuItem itemReadSetting;
075        private JMenuItem itemSaveSetting;
076        private JMenu menuUseSetting;
077    
078        private JMenu menuOverlapViz;
079        private JMenuItem itemLinkViz;
080    
081        private JMenu menuSelection;
082        private JMenuItem itemCurrentSelection;
083        private JMenuItem itemAutoSelection;
084    
085        private JRadioButtonMenuItem[] itemSettings;
086        private JMenuItem itemSynOverlap;
087        private JMenuItem itemAsynOverlap;
088    
089        private JMenuItem itemEnablePhaseDetector;
090    
091        private JMenu menuOptions;
092        private JMenuItem itemPath;
093        private JMenuItem itemInfo;
094    
095        private JMenu menuHelp;
096        private JMenuItem itemAbout;
097    
098        private JDialog dialog;
099        private JComboBox comboColumn;
100        private JList listVisualization;
101        private DefaultListModel model;
102    
103        private JDialog dialogAbout;
104    
105        private String lastConfigDir, lastDataDir, lastResultDir;
106    
107        private JToolBar toolbar;
108        private EVolve.util.phasedetectors.phasedetectorUI.PhaseDetectorToolBar toolbarPhaseDetector;
109        private JButton tblVizNow, tblConfigure;
110        private JComboBox tblComboDataSource;
111    
112        public UIManager() {
113            try {
114                javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getCrossPlatformLookAndFeelClassName());
115            } catch (Exception e) {}
116    
117            frame = new JFrame(Scene.VERSION);
118    
119            ImageIcon icon = new ImageIcon(this.getClass().getResource("img/logo_icon.gif"));
120            frame.setIconImage(icon.getImage());
121    
122            frame.addWindowListener(new WindowAdapter() {
123                public void windowClosing(WindowEvent e) {
124                    System.exit(0);
125                }
126            });
127    
128            frame.setBounds(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
129    
130            windowList = new ArrayList();
131    
132            createMenu();
133    
134            createToolBar();
135            frame.getContentPane().add(toolbar, BorderLayout.NORTH);
136    
137    
138            desktop = new JDesktopPane();
139            desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
140            frame.getContentPane().add(desktop, BorderLayout.CENTER);
141    
142            panelStatus = new JPanel(new BorderLayout());
143            panelStatus.setBackground(new Color(240, 240, 240));
144            panelStatus.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLoweredBevelBorder(), BorderFactory.createLineBorder(new Color(240, 240, 240), 2)));
145            frame.getContentPane().add(panelStatus, BorderLayout.SOUTH);
146    
147            labelStatus = new JLabel(Scene.VERSION);
148            panelStatus.add(labelStatus, BorderLayout.WEST);
149    
150            frame.setVisible(true);
151    
152            createDialog();
153            createAbout();
154            doNotRemoveWindow = false;
155    
156            lastDataDir = "";
157            lastConfigDir = "";
158            lastResultDir="";
159        }
160    
161        private void createMenu() {
162            menuBar = new JMenuBar();
163            frame.setJMenuBar(menuBar);
164    
165            menuFile = new JMenu("File");
166            menuFile.setMnemonic(KeyEvent.VK_F);
167            menuBar.add(menuFile);
168    
169            itemLoad = new JMenuItem("Load Data...");
170            itemLoad.setMnemonic(KeyEvent.VK_L);
171            itemLoad.addActionListener(new ActionListener() {
172                public void actionPerformed(ActionEvent e) {
173                    Scene.loadDataSource();
174                    for (int i = 0; i<Scene.getToolsManager().getPredefinedVisualizationRunner().getPredefinedVisualizationNumber(); i++) {
175                        Scene.getToolsManager().getPredefinedVisualizationRunner().getPredefinedVizByIndex(i).setTranslated(false);
176                    }
177                }
178            });
179            menuFile.add(itemLoad);
180            menuFile.addSeparator();
181    
182            itemAddDataSource = new JMenuItem("Add Data Source...");
183            itemAddDataSource.setMnemonic(KeyEvent.VK_A);
184            itemAddDataSource.addActionListener(new ActionListener() {
185                public void actionPerformed(ActionEvent e) {
186                    String name = JOptionPane.showInputDialog(getDesktop(),"Name of the new data source:");
187                    if (name != null) {
188                        Scene.getDataSourceManager().addDataSource(name);
189                        updateDatasourceCombo();
190                    }
191                }
192            });
193            menuFile.add(itemAddDataSource);
194            menuFile.addSeparator();
195    
196            itemExit = new JMenuItem("Exit");
197            itemExit.setMnemonic(KeyEvent.VK_X);
198            itemExit.addActionListener(new ActionListener() {
199                public void actionPerformed(ActionEvent e) {
200                    System.exit(0);
201                }
202            });
203            menuFile.add(itemExit);
204    
205            menuVisualization = new JMenu("Visualization");
206            menuVisualization.setMnemonic(KeyEvent.VK_V);
207            menuBar.add(menuVisualization);
208    
209            menuNew = new JMenu("New");
210            menuNew.setMnemonic(KeyEvent.VK_N);
211            menuVisualization.add(menuNew);
212    
213            itemPredefinedVisualize = new JMenuItem("Predefined Visualize");
214            itemPredefinedVisualize.setMnemonic(KeyEvent.VK_P);
215            itemPredefinedVisualize.addActionListener(new ActionListener() {
216                public void actionPerformed(ActionEvent e) {
217                    Scene.getToolsManager().getPredefinedVisualizationRunner().runPredefinedVisualization();
218                }
219            });
220            menuVisualization.add(itemPredefinedVisualize);
221    
222            itemVisualize = new JMenuItem("Visualize...");
223            itemVisualize.setMnemonic(KeyEvent.VK_V);
224            itemVisualize.addActionListener(new ActionListener() {
225                public void actionPerformed(ActionEvent e) {
226                    Scene.getVisualizationManager().preVisualize();
227                }
228            });
229            menuVisualization.add(itemVisualize);
230    
231            menuWindow = new JMenu("Window");
232            menuWindow.setMnemonic(KeyEvent.VK_W);
233            menuBar.add(menuWindow);
234    
235            itemArrange = new JMenuItem("Arrange...");
236            itemArrange.setMnemonic(KeyEvent.VK_A);
237            itemArrange.addActionListener(new ActionListener() {
238                public void actionPerformed(ActionEvent e) {
239                    arrange();
240                }
241            });
242            menuWindow.add(itemArrange);
243    
244            menuTool = new JMenu("Tools");
245            menuTool.setMnemonic(KeyEvent.VK_T);
246            menuBar.add(menuTool);
247    
248            itemBuildBatch = new JMenuItem("Build Batch");
249            itemBuildBatch.setMnemonic(KeyEvent.VK_B);
250            itemBuildBatch.addActionListener(new ActionListener() {
251                public void actionPerformed(ActionEvent e) {
252                    Scene.getToolsManager().getBatchRunner().showWindow();
253                 }
254            });
255            itemRunBatch = new JMenuItem("Run Batch");
256            itemRunBatch.setMnemonic(KeyEvent.VK_R);
257            itemRunBatch.addActionListener(new ActionListener() {
258                public void actionPerformed(ActionEvent e) {
259                    if (Scene.getToolsManager().getBatchRunner() != null)
260                        Scene.getToolsManager().getBatchRunner().runBatch();
261                }
262            });
263            menuBatch = new JMenu("Auto Generate Visualizations");
264            menuBatch.setMnemonic(KeyEvent.VK_A);
265            menuBatch.add(itemBuildBatch);
266            menuBatch.add(itemRunBatch);
267    
268            itemReadSetting = new JMenuItem("Load Predefined Viz Setting");
269            itemReadSetting.setMnemonic(KeyEvent.VK_L);
270            itemReadSetting.addActionListener(new ActionListener() {
271                public void actionPerformed(ActionEvent e) {
272                    VisualizationSerializer.v().loadConfiguration();
273                }
274            });
275            itemSaveSetting = new JMenuItem("Save Current Viz Setting");
276            itemSaveSetting.setMnemonic(KeyEvent.VK_S);
277            itemSaveSetting.addActionListener(new ActionListener() {
278                public void actionPerformed(ActionEvent e) {
279                    ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
280                    if (vizList.size() == 0) return;
281    
282                    VisualizationSerializer.v().showSavingDialog();
283                }
284            });
285            menuUseSetting = new JMenu("Choose Predefined Viz Setting");
286            menuUseSetting.setMnemonic(KeyEvent.VK_C);
287            menuPredefinedViz = new JMenu("Predefined Visualization");
288            menuPredefinedViz.setMnemonic(KeyEvent.VK_P);
289            menuPredefinedViz.add(itemReadSetting);
290            menuPredefinedViz.add(itemSaveSetting);
291            menuPredefinedViz.add(menuUseSetting);
292    
293    
294            itemLinkViz = new JMenuItem("Unify Visualizations...");
295            itemLinkViz.setMnemonic(KeyEvent.VK_U);
296            itemLinkViz.addActionListener(new ActionListener() {
297                public void actionPerformed(ActionEvent e) {
298                    Scene.getToolsManager().getLinkedVisualizationRunner().showWindow();
299                }
300            });
301    
302            itemSynOverlap = new JMenuItem("Overlap Visualizations...");
303            itemSynOverlap.setMnemonic(KeyEvent.VK_O);
304            itemSynOverlap.addActionListener(new ActionListener() {
305                public void actionPerformed(ActionEvent e) {
306                    Scene.getToolsManager().getOverlapVisualizationRunner().getSynOverlapper().showWindow();
307                }
308            });
309            itemAsynOverlap = new JMenuItem("Auto Overlap Visualizations ...");
310            itemAsynOverlap.setMnemonic(KeyEvent.VK_A);
311            itemAsynOverlap.addActionListener(new ActionListener() {
312                public void actionPerformed(ActionEvent e) {
313                    Scene.getToolsManager().getOverlapVisualizationRunner().getAsynOverlapper().showWindow();
314                }
315            });
316            menuOverlapViz = new JMenu("Overlap Visualizations");
317            menuOverlapViz.setMnemonic(KeyEvent.VK_O);
318            menuOverlapViz.add(itemSynOverlap);
319            menuOverlapViz.add(itemAsynOverlap);
320    
321            itemEnablePhaseDetector = new JMenuItem("Enable Phase Detector");
322            itemEnablePhaseDetector.setMnemonic(KeyEvent.VK_E);
323            itemEnablePhaseDetector.addActionListener(new ActionListener() {
324                public void actionPerformed(ActionEvent e) {
325                    toolbarPhaseDetector.setVisible(true);
326                    refreshToolBar();
327                    Scene.getVisualizationManager().enablePhaseDetector(true);
328                }
329            });
330    
331    
332            menuSelection = new JMenu("Selection");
333            menuSelection.setMnemonic(KeyEvent.VK_S);
334            menuSelection.addMenuListener(new MenuListener() {
335                public void menuSelected(MenuEvent e) {
336                    menuSelection.removeAll();
337                    createSelectionMenuItem();
338                }
339                public void menuDeselected(MenuEvent e) {
340    
341                }
342                public void menuCanceled(MenuEvent e) {
343    
344                }
345            });
346            menuBar.add(menuSelection);
347    
348            menuTool.add(menuBatch);
349            menuTool.add(menuPredefinedViz);
350            menuTool.add(menuOverlapViz);
351            menuTool.add(itemLinkViz);
352            menuTool.add(itemEnablePhaseDetector);
353    
354            menuOptions = new JMenu("Options");
355            menuOptions.setMnemonic(KeyEvent.VK_O);
356            menuBar.add(menuOptions);
357    
358            itemPath = new JMenuItem("Setting Path...");
359            itemPath.setMnemonic(KeyEvent.VK_S);
360            itemPath.addActionListener(new ActionListener() {
361                public void actionPerformed(ActionEvent e) {
362                    SceneSetting.v().showSettingDialog();
363                }
364            });
365    
366            itemInfo = new JMenuItem("View Current Setting");
367            itemInfo.setMnemonic(KeyEvent.VK_V);
368            itemInfo.addActionListener(new ActionListener() {
369                public void actionPerformed(ActionEvent e) {
370                    SceneSetting.v().showCurrentSetting();
371                }
372            });
373            menuOptions.add(itemPath);
374            menuOptions.add(itemInfo);
375    
376            menuHelp = new JMenu("Help");
377            menuHelp.setMnemonic(KeyEvent.VK_H);
378            menuBar.add(menuHelp);
379    
380            itemAbout = new JMenuItem("About EVolve...");
381            itemAbout.setMnemonic(KeyEvent.VK_A);
382            itemAbout.addActionListener(new ActionListener() {
383                public void actionPerformed(ActionEvent e) {
384                    showDialog(dialogAbout, 300, 150);
385                }
386            });
387            menuHelp.add(itemAbout);
388        }
389    
390        private void createToolBar() {
391            toolbar = new JToolBar();
392            toolbar.setPreferredSize(new java.awt.Dimension(frame.getWidth(),31));
393            FlowLayout layout = new FlowLayout(FlowLayout.LEFT,2,0);
394            layout.layoutContainer(toolbar);
395            toolbar.setLayout(layout);
396            toolbar.setFloatable(false);
397            toolbar.setRollover(true);
398            toolbar.setBackground(new Color(207,207,207));
399    
400            tblComboDataSource = new JComboBox();
401            ArrayList dmList = Scene.getDataSourceManager().getDataManagerList();
402            for (int i=0; i<dmList.size(); i++) {
403                tblComboDataSource.addItem(((DataManager)dmList.get(i)).getDatasourceName());
404            }
405            tblComboDataSource.addActionListener(new ActionListener() {
406                public void actionPerformed(ActionEvent e) {
407                    DataSourceManager dsm = Scene.getDataSourceManager();
408                    dsm.switchDataSource(tblComboDataSource.getSelectedIndex());
409                    if (Scene.getDataManager().isDataLoaded() == false) {
410                        disableFunctionMenus();
411                    } else {
412                        enableMenu();
413                    }
414                }
415            });
416    
417            tblConfigure = new JButton(new ImageIcon(Scene.getGifURL("config.gif")));
418            tblConfigure.setToolTipText("Configure Current Visualization");
419            tblConfigure.addActionListener(new ActionListener() {
420                public void actionPerformed(ActionEvent e) {
421                    Visualization visual = Scene.getVisualizationManager().getActiveVisualization();
422                    if (visual != null) visual.configure();
423                }
424            });
425            tblConfigure.setPreferredSize(new java.awt.Dimension(28,28));
426    
427            tblVizNow = new JButton(new ImageIcon(Scene.getGifURL("vizNow.gif")));
428            tblVizNow.setToolTipText("Visualize Current Visualization Now");
429            tblVizNow.addActionListener(new ActionListener() {
430                public void actionPerformed(ActionEvent e) {
431                    Scene.getVisualizationManager().visualizeNow();
432                }
433            });
434            tblVizNow.setPreferredSize(new java.awt.Dimension(28,28));
435    
436            toolbarPhaseDetector = new EVolve.util.phasedetectors.phasedetectorUI.PhaseDetectorToolBar();
437            toolbarPhaseDetector.setVisible(false);
438    
439            toolbar.add(new JLabel("Data Source: "));
440            toolbar.add(tblComboDataSource);
441            toolbar.add(tblConfigure);
442            toolbar.add(tblVizNow);
443            toolbar.add(toolbarPhaseDetector);
444    
445            toolbar.addContainerListener(new ContainerAdapter() {
446                public void componentAdded(ContainerEvent e) {
447                    refreshToolBar();
448                }
449    
450                public void componentRemoved(ContainerEvent e) {
451                    refreshToolBar();
452                }
453            });
454        }
455    
456        private void createDialog() {
457            dialog = new JDialog(frame, "Select Windows", true);
458            model = new DefaultListModel();
459            listVisualization = new JList(model);
460            listVisualization.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
461    
462            JPanel panelColumn = new JPanel(new FlowLayout());
463            dialog.getContentPane().add(panelColumn, BorderLayout.NORTH);
464    
465            panelColumn.add(new JLabel("Number of column: "));
466    
467            comboColumn = new JComboBox();
468            comboColumn.addItem("   1   ");
469            comboColumn.addItem("   2   ");
470            comboColumn.addItem("   3   ");
471            comboColumn.addItem("   4   ");
472            panelColumn.add(comboColumn);
473    
474            JScrollPane scrollPane = new JScrollPane(listVisualization);
475            scrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose windows"));
476            dialog.getContentPane().add(scrollPane, BorderLayout.CENTER);
477    
478            JPanel panelButton = new JPanel(new FlowLayout());
479            dialog.getContentPane().add(panelButton, BorderLayout.SOUTH);
480    
481            JButton buttonApply = new JButton("Apply");
482            buttonApply.addActionListener(new ActionListener() {
483                public void actionPerformed(ActionEvent e) {
484                    dialogApply();
485                }
486            });
487            panelButton.add(buttonApply);
488    
489            JButton buttonCancel = new JButton("Cancel");
490            buttonCancel.addActionListener(new ActionListener() {
491                public void actionPerformed(ActionEvent e) {
492                    dialogCancel();
493                }
494            });
495            panelButton.add(buttonCancel);
496        }
497    
498        public void createAbout() {
499            dialogAbout = new JDialog(frame, "About EVolve", true);
500            dialogAbout.getContentPane().setBackground(new Color(240, 240, 240));
501            dialogAbout.getContentPane().add(new JLabel(new ImageIcon(this.getClass().getResource("img/logo_about.gif"))), BorderLayout.CENTER);
502        }
503    
504        public void init() {
505            if (doNotRemoveWindow) return;
506            /*windowList.clear();
507            JInternalFrame[] frame = desktop.getAllFrames();
508            for (int i = 0; i < frame.length; i++) {
509                frame[i].dispose();
510            }*/
511            ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
512            ArrayList newWindowList = new ArrayList();
513            int datasourceId = Scene.getDataSourceManager().getCurrentDataSourceId();
514            for (int i=0; i<vizList.size(); i++) {
515                Visualization visual = (Visualization)vizList.get(i);
516                EVolve.Window window = visual.getWindow();
517                if (visual.getDataSourceId() == datasourceId)
518                    window.dispose();
519                else
520                    newWindowList.add(window);
521            }
522            windowList = newWindowList;
523    
524            disableFunctionMenus();
525            menuWindow.setEnabled(false);
526        }
527    
528        public JFrame getFrame() {
529            return frame;
530        }
531    
532        public void setStatus(String status) {
533            labelStatus.setText(status);
534        }
535    
536        public void enableMenu() {
537            menuNew.removeAll();
538            String[] name = Scene.getVisualizationManager().getFactoryName();
539            itemNew = new JMenuItem[name.length];
540            for (int i = 0; i < itemNew.length; i++) {
541                itemNew[i] = new JMenuItem(((char)(i + 65)) + " - " + name[i]);
542                itemNew[i].setMnemonic(i + 65);
543                itemNew[i].addActionListener(new ActionListener() {
544                    public void actionPerformed(ActionEvent e) {
545                        Scene.getVisualizationManager().newVisualization(((JMenuItem)(e.getSource())).getText().substring(4));
546                        menuSelection.removeAll();
547                        createSelectionMenuItem();
548                    }
549                });
550                menuNew.add(itemNew[i]);
551            }
552    
553            menuVisualization.setEnabled(true);
554            menuWindow.setEnabled(true);
555            menuSelection.setEnabled(true);
556    
557            //tblVizNow.setEnabled(true);
558            //tblConfigure.setEnabled(true);
559            updateToolbarButtons();
560        }
561    
562        public void enableFileMenus() {
563            menuFile.setEnabled(true);
564            menuSelection.setEnabled(true);
565            menuTool.setEnabled(true);
566        }
567    
568        public void showDialog(JDialog dialog, int width, int height) {
569            dialog.setBounds((Toolkit.getDefaultToolkit().getScreenSize().width - width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - height) / 2, width, height);
570            dialog.setVisible(true);
571        }
572    
573        public void addVisualization(Visualization visualization) {
574            Window newWindow = new Window(visualization);
575            newWindow.setBounds(0, 0, desktop.getSize().width, desktop.getSize().height);
576            newWindow.setVisible(true);
577    
578            desktop.add(newWindow);
579            newWindow.addInternalFrameListener(new InternalFrameAdapter() {
580                public void internalFrameActivated(InternalFrameEvent e) {
581                    refreshToolBar();
582                }
583    
584                public void internalFrameClosed(InternalFrameEvent e) {
585                    refreshToolBar();
586                }
587    
588                public void internalFrameOpened(InternalFrameEvent e) {
589                    refreshToolBar();
590                }
591            });
592            try {
593                newWindow.setSelected(true);
594            } catch (Exception e) {};
595    
596            windowList.add(newWindow);
597    
598            visualization.setWindow(newWindow);
599            updateToolbarButtons();
600            refreshToolBar();
601        }
602    
603        public Window addOverlappedVisualization(OverlapVisualization visual) {
604            Window newWindow = new Window(visual);
605            newWindow.setBounds(0, 0, desktop.getSize().width/2, desktop.getSize().height/2);
606            newWindow.setVisible(true);
607    
608            desktop.add(newWindow);
609            try {
610                newWindow.setSelected(true);
611            } catch (Exception e) {};
612    
613            windowList.add(newWindow);
614            return newWindow;
615        }
616    
617        public void removeWindow(Window window) {
618            window.dispose();
619            Scene.getVisualizationManager().removeVisualization(window.getVisualization());
620            windowList.remove(window);
621            updateToolbarButtons();
622        }
623    
624        private void arrange() {
625            int selectedCounter = 0;
626            for (int i = 0; i < windowList.size(); i++) {
627                if (!((Window)(windowList.get(i))).isIcon()) {
628                    selectedCounter++;
629                }
630            }
631    
632            int[] selected = new int[selectedCounter];
633            selectedCounter = 0;
634    
635            model.removeAllElements();
636    
637            for (int i = 0; i < windowList.size(); i++) {
638                model.addElement(((Window)(windowList.get(i))).getTitle());
639                if (!((Window)(windowList.get(i))).isIcon()) {
640                    selected[selectedCounter] = i;
641                    selectedCounter++;
642                }
643            }
644    
645            listVisualization.setSelectedIndices(selected);
646    
647            showDialog(dialog, 270, 360);
648        }
649    
650        private void dialogApply() {
651            dialog.setVisible(false);
652    
653            for (int i = 0; i < windowList.size(); i++) {
654                try {
655                    ((Window)(windowList.get(i))).setIcon(true);
656                } catch (Exception e) {}
657            }
658    
659            int[] selected = listVisualization.getSelectedIndices();
660    
661            if (selected.length != 0) {
662                boolean[] located = new boolean[selected.length];
663                for (int i = 0; i < located.length; i++) {
664                    located[i] = false;
665                }
666    
667                int columnNumber = comboColumn.getSelectedIndex() + 1;
668                int width = desktop.getWidth() / columnNumber;
669                int height = desktop.getHeight() / ((selected.length - 1) / columnNumber + 1);
670    
671                for (int i = 0; i < selected.length; i++) {
672                    int x = (i % columnNumber) * width;
673                    int y = (i / columnNumber) * height;
674    
675                    int minDistance = Integer.MAX_VALUE;
676                    int minIndex = -1;
677    
678                    for (int j = 0; j < selected.length; j++) {
679                        if (!located[j]) {
680                            int distance = (((Window)(windowList.get(selected[j]))).getX() - x) * (((Window)(windowList.get(selected[j]))).getX() - x) + (((Window)(windowList.get(selected[j]))).getY() - y) * (((Window)(windowList.get(selected[j]))).getY() - y);
681                            if (distance < minDistance) {
682                                minDistance = distance;
683                                minIndex = j;
684                            }
685                        }
686                    }
687    
688                    try {
689                        ((Window)(windowList.get(selected[minIndex]))).setIcon(false);
690                        ((Window)(windowList.get(selected[minIndex]))).setBounds(x, y, width, height);
691                        located[minIndex] = true;
692                    } catch (Exception e) {}
693                }
694            }
695        }
696    
697        private void dialogCancel() {
698            dialog.setVisible(false);
699        }
700    
701        public void refreshMenu(String filename,String configureName) {
702            int selIndex = 0;
703            if (Scene.getToolsManager().getPredefinedVisualizationRunner().containsConfigure(configureName)) {
704                Scene.showErrorMessage("Visualization configuration for this name already exists!");
705                return;
706            }
707    
708            Scene.getToolsManager().getPredefinedVisualizationRunner().addPredefinedVisualization(filename,configureName);
709            menuUseSetting.removeAll();
710            itemSettings = new JRadioButtonMenuItem[Scene.getToolsManager().getPredefinedVisualizationRunner().getPredefinedVisualizationNumber()];
711            for (int i = 0; i < itemSettings.length; i++) {
712                String addConfigureName = Scene.getToolsManager().getPredefinedVisualizationRunner().getConfigureName(i);
713                if (addConfigureName.equals(configureName)) {
714                    Scene.getToolsManager().getPredefinedVisualizationRunner().setSelected(i);
715                    selIndex = i;
716                }
717                itemSettings[i] = new JRadioButtonMenuItem(addConfigureName);
718                itemSettings[i].addActionListener(new ActionListener() {
719                    public void actionPerformed(ActionEvent e) {
720                        for (int i=0; i<itemSettings.length; i++) {
721                            if (itemSettings[i].isSelected()) itemSettings[i].setSelected(false);
722                        }
723                        int selected = Scene.getToolsManager().getPredefinedVisualizationRunner().getIdFromName(
724                                       ((JRadioButtonMenuItem)(e.getSource())).getText());
725                        Scene.getToolsManager().getPredefinedVisualizationRunner().setSelected(selected);
726                        itemSettings[selected].setSelected(true);
727                    }
728                });
729                menuUseSetting.add(itemSettings[i]);
730            }
731            itemSettings[selIndex].setSelected(true);
732        }
733    
734        public void clearWindowsList() {
735            windowList.clear();
736        }
737    
738        public void setDoNotRemoveWindow(boolean newValue) {
739            doNotRemoveWindow = newValue;
740        }
741    
742        public JDesktopPane getDesktop() {
743            return desktop;
744        }
745    
746        public String getLastDataDir() {
747            return lastDataDir;
748        }
749    
750        public void setLastDataDir(String dir) {
751            lastDataDir = dir;
752        }
753    
754        public String getLastConfigDir() {
755            return lastConfigDir;
756        }
757    
758        public void setLastConfigDir(String dir) {
759            lastConfigDir = dir;
760        }
761    
762        public String getLastResultDir() {
763            return lastResultDir;
764        }
765    
766        public void setLastResultDir(String dir) {
767            lastResultDir = dir;
768        }
769    
770        public void disableFunctionMenus() {
771            menuVisualization.setEnabled(false);
772            menuSelection.setEnabled(false);
773            tblVizNow.setEnabled(false);
774            tblConfigure.setEnabled(false);
775        }
776    
777        public void disableFileMenus() {
778            menuFile.setEnabled(false);
779            menuSelection.setEnabled(false);
780            menuTool.setEnabled(false);
781        }
782    
783        public void loadSelection() {
784            RandomAccessFile selectionFile;
785            JFileChooser fc = new JFileChooser(getLastConfigDir());
786            String filename = null;
787    
788            if(fc.showOpenDialog(frame) != JFileChooser.APPROVE_OPTION) return;
789    
790            try {
791                filename = fc.getSelectedFile().getPath();
792                setLastConfigDir(filename);
793                selectionFile = new RandomAccessFile(filename, "r");
794    
795                //String version = selectionFile.readLine().trim();
796                //if (!version.equals(Scene.VERSION)) throw (new IOException());
797                //selectionName = selectionFile.readLine().trim();
798    
799                Scene.getFilter().loadSelection(selectionFile);
800    
801            } catch (Exception e) {
802                Scene.showErrorMessage("Invalid selection file format.");
803                return;
804            }
805        }
806    
807        private void createSelectionMenuItem() {
808            Visualization visual = Scene.getVisualizationManager().getActiveVisualization();
809            JMenuItem[] tempMenus = null;
810    
811            if (visual!=null) tempMenus = visual.createSelectionMenuItem();
812    
813            if (tempMenus != null) {
814                for (int i=0; i<tempMenus.length; i++)
815                    menuSelection.add(tempMenus[i]);
816            }
817    
818            itemCurrentSelection = new JMenuItem("Current Selections...");
819            itemCurrentSelection.setMnemonic(KeyEvent.VK_C);
820            itemCurrentSelection.addActionListener(new ActionListener() {
821                public void actionPerformed(ActionEvent e) {
822                    Scene.getFilter().load();
823                }
824            });
825            
826            itemAutoSelection = new JMenuItem("Make Selection with RegExp");
827            itemAutoSelection.setMnemonic(KeyEvent.VK_A);
828            itemAutoSelection.addActionListener(new ActionListener() {
829                public void actionPerformed(ActionEvent e) {
830                    Scene.getFilter().selectWithRegExp();
831                }
832            });
833    
834            menuSelection.add(itemCurrentSelection);        
835            menuSelection.add(itemAutoSelection);
836        }
837    
838        public String getSelectionOptions() {
839            String retString = "";
840            MenuElement[] subItems = null;
841    
842            try {
843                subItems = menuSelection.getSubElements()[0].getSubElements();
844            } catch (ArrayIndexOutOfBoundsException e) {
845                menuSelection.removeAll();
846                createSelectionMenuItem();
847                subItems = menuSelection.getSubElements()[0].getSubElements();
848            }
849    
850            for (int i=0; i<subItems.length - 2; i++) {
851                String menuText = ((JCheckBoxMenuItem)subItems[i]).getText();
852                if (((JCheckBoxMenuItem)(subItems[i])).isSelected()) {
853                    if (menuText.indexOf("Entit") != -1)
854                        menuText = menuText + " inside box";
855                    retString = retString + "-" + menuText + "\n";
856                }
857            }
858    
859            return retString.length() == 0 ? "Occurred Entities\n" : retString;
860        }
861    
862        public void updateDatasourceCombo() {
863            int dsourceId = tblComboDataSource.getSelectedIndex();
864    
865            tblComboDataSource.removeAllItems();
866            ArrayList dmList = Scene.getDataSourceManager().getDataManagerList();
867            for (int i=0; i<dmList.size(); i++) {
868                tblComboDataSource.addItem(((DataManager)dmList.get(i)).getDatasourceName());
869            }
870            tblComboDataSource.setSelectedIndex(dsourceId);
871            refreshToolBar();
872        }
873    
874        public void enableSelectionMenu() {
875            menuSelection.setEnabled(true);
876            createSelectionMenuItem();
877        }
878    
879        public void selectDataSource(int dataSourceId) {
880            tblComboDataSource.setSelectedIndex(dataSourceId);
881        }
882    
883        public void updateToolbarButtons() {
884            boolean hasViz = windowList.size() > 0;
885    
886            tblVizNow.setEnabled(hasViz);
887            tblConfigure.setEnabled(hasViz);
888        }
889    
890        public void refreshToolBar() {
891            int toolbarWidth = 0;
892    
893            toolbarPhaseDetector.refresh();
894            for (int i=0; i<toolbar.getComponents().length; i++) {
895                if (!toolbar.getComponent(i).isVisible()) continue;
896                double width = toolbar.getComponent(i).getPreferredSize().getWidth();
897    
898                if (width < toolbar.getComponent(i).getWidth())
899                    width = toolbar.getComponent(i).getWidth();
900    
901                toolbarWidth += width;
902            }
903            if (toolbarWidth>=Toolkit.getDefaultToolkit().getScreenSize().width-4) {
904                toolbar.setBounds(0,0,frame.getWidth(),60);
905                toolbar.setPreferredSize(new Dimension(frame.getWidth(),60));
906            } else {
907                toolbar.setPreferredSize(new Dimension(frame.getWidth(),30));
908                toolbar.setBounds(0,0,frame.getWidth(),30);
909            }
910            toolbar.revalidate();
911            desktop.revalidate();
912    
913        }
914    
915        public void enablePhaseDetectorButton(boolean flag) {
916            toolbarPhaseDetector.enableButton(flag);
917            toolbarPhaseDetector.updateVisualization(false);
918        }
919    
920        public void updateFunctionControl(boolean flag) {
921            menuVisualization.setEnabled(flag);
922            menuSelection.setEnabled(flag);
923            tblVizNow.setEnabled(flag);
924            tblConfigure.setEnabled(flag);
925    
926            menuFile.setEnabled(flag);
927            menuSelection.setEnabled(flag);
928            menuTool.setEnabled(flag);
929    
930            for (int i=0; i<toolbar.getComponents().length; i++) {
931                toolbar.getComponent(i).setEnabled(flag);
932            }
933            toolbarPhaseDetector.enableButton(flag);
934        }
935    
936        public PhaseDetectorToolBar getPhaseDetectorToolBar() {
937            return toolbarPhaseDetector;
938        }
939    }